package site.shenjie.hystrix.demo;

import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
import site.shenjie.hystrix.demo.command.ClearCacheHystrixCommand;
import site.shenjie.hystrix.demo.command.MyHystrixCommand;
import site.shenjie.hystrix.demo.other.MyHystrixCollapser;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class HystrixDemoApplication {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        testOne();
        testTwo();
    }

    /**
     * 测试请求合并知识
     */
    public static void testTwo() throws InterruptedException, ExecutionException {
        // 通过 MyHystrixCollapser 创建两个执行任务，按照正常的逻辑肯定是分别执行这两个任务，通过 HystrixCollapser 可以将多个任务合并到一起执行。从输出结果就可以看出，任务的执行是在 run 方法中去做的
        HystrixRequestContext context = HystrixRequestContext.initializeContext();
        Future<String> f1 = new MyHystrixCollapser("请求一").queue();

        // 中断一下看看会不会合并请求（测试发现实用sleep中断后，会执行两次请求（即：不会合并请求））
        // 测试发现，sleep==5时是一个临界点，偶尔请求不合并，偶尔又合并，低于5一定合并，高于5一定不合并
        Thread.sleep(5);

        Future<String> f2 = new MyHystrixCollapser("请求二").queue();
        System.out.println(f1.get() + "\n" + f2.get());
        context.shutdown();
    }

    /**
     * 测试三部分知识：
     * 1.简单实用Hystrix
     * 2.实用缓存
     * 3.清除缓存
     */
    public static void testOne() throws ExecutionException, InterruptedException {
        // 如果使用了缓存（即：重写了getCacheKey方法）的话，则需要初始化HystrixRequestContext
        HystrixRequestContext context = HystrixRequestContext.initializeContext();
        // 测试缓存存入（第二次获取到的返回值来自缓存，所以不会执行run方法，不会再次打印：get data
        {
            // 同步调用
            String result = String.valueOf(new MyHystrixCommand("沈杰").execute());
            System.out.println(result);

            // 异步调用
            Future future = new MyHystrixCommand("沈杰").queue();
            System.out.println(future.get());
        }

        System.out.println("================================================");

        // 测试清除缓存的多次调用（第一次执行会清除缓存，所以第二次调用会重新执行run方法，于是会打印两次：get data
        {
            String result = new ClearCacheHystrixCommand("SJ").execute();
            System.out.println(result);

            // 清除缓存
            ClearCacheHystrixCommand.flushCache("SJ");

            Future future = new ClearCacheHystrixCommand("SJ").queue();
            System.out.println(future.get());
        }
        context.shutdown();
    }
}
